import dynamic from 'next/dynamic' import NextImage from 'next/image'; import { useEffect, useState } from 'react' import { useRouter } from 'next/router' import Seo from '../../../core/components/Seo.jsx' import Promocrumb from '../../../lib/promo/components/Promocrumb.jsx' import { fetchPromoItemsSolr, fetchVariantSolr } from '../../../api/promoApi.js' import LogoSpinner from '../../../core/components/elements/Spinner/LogoSpinner.jsx' import ProductPromoCard from '../../../../src-migrate/modules/product-promo/components/Card.tsx' import { IPromotion } from '../../../../src-migrate/types/promotion.ts' import React from 'react' import { SolrResponse } from "../../../../src-migrate/types/solr.ts"; import DesktopView from '../../../core/components/views/DesktopView.jsx'; import MobileView from '../../../core/components/views/MobileView.jsx'; import 'swiper/swiper-bundle.css'; import useDevice from '../../../core/hooks/useDevice.js' import ProductFilterDesktop from '../../../lib/product/components/ProductFilterDesktopPromotion.jsx'; import ProductFilter from '../../../lib/product/components/ProductFilter.jsx'; import { HStack, Image, Tag, TagCloseButton, TagLabel } from '@chakra-ui/react'; import { formatCurrency } from '../../../core/utils/formatValue.js'; import Pagination from '../../../core/components/elements/Pagination/Pagination.js'; import SideBanner from '../../../../src-migrate/modules/side-banner/index.tsx'; import whatsappUrl from '../../../core/utils/whatsappUrl.js'; import { cons, toQuery } from 'lodash-contrib'; import _ from 'lodash'; import useActive from '../../../core/hooks/useActive.js'; import useProductSearch from '../../../lib/promo/hooks/usePromotionSearch.js'; const BasicLayout = dynamic(() => import('../../../core/components/layouts/BasicLayout.jsx')) export default function PromoDetail() { const router = useRouter() const { slug = '', brand ='', category='', priceFrom = '', priceTo = '', page = '1' } = router.query const [promoItems, setPromoItems] = useState([]) const [promoData, setPromoData] = useState(null) const [currentPage, setCurrentPage] = useState(parseInt(10) || 1); const itemsPerPage = 12; // Jumlah item yang ingin ditampilkan per halaman const [loading, setLoading] = useState(true); const { isMobile, isDesktop } = useDevice() // const [brands, setBrands] = useState([]); // const [categories, setCategories] = useState([]); const [brandValues, setBrandValues] = useState([]); const [categoryValues, setCategoryValues] = useState([]); const [orderBy, setOrderBy] = useState(router.query?.orderBy); const popup = useActive(); const prefixUrl = `/shop/promo/${slug}` const [queryFinal, setQueryFinal] = useState({}); const [limit, setLimit] = useState(22); const [q, setQ] = useState('*'); const [finalQuery, setFinalQuery] = useState({fq: `type_value_s:${slug}`}); const [products, setProducts] = useState(null); useEffect(() => { setQueryFinal({ ...finalQuery, q, limit, orderBy }); }, [router.query, prefixUrl, slug, brand, category, priceFrom, priceTo, currentPage]); useEffect(() => { setQueryFinal({ ...finalQuery, q, limit, orderBy }); }, [router.query, prefixUrl, slug, brand, category, priceFrom, priceTo, currentPage]); const { productSearch } = useProductSearch({ query: queryFinal, operation: 'OR', }); console.log("productSearch",productSearch) console.log("queryFinal",queryFinal) const pageCount = Math.ceil(productSearch.data?.response.numFound / limit); const productStart = productSearch.data?.responseHeader.params.start; const productRows = limit; const productFound = productSearch.data?.response.numFound; useEffect(() => { setProducts(productSearch.data?.response?.products); }, [productSearch]); console.log("products",products) const brands = []; for ( let i = 0; i < productSearch.data?.facet_counts?.facet_fields?.manufacture_name_s.length; i += 2 ) { const brand = productSearch.data?.facet_counts?.facet_fields?.manufacture_name_s[i]; const qty = productSearch.data?.facet_counts?.facet_fields?.manufacture_name_s[i + 1]; if (qty > 0) { brands.push({ brand, qty }); } } console.log("brands",brands) const categories = []; for ( let i = 0; i < productSearch.data?.facet_counts?.facet_fields?.category_name.length; i += 2 ) { const name = productSearch.data?.facet_counts?.facet_fields?.category_name[i]; const qty = productSearch.data?.facet_counts?.facet_fields?.category_name[i + 1]; if (qty > 0) { categories.push({ name, qty }); } } useEffect(() => { if (router.query.brand) { let brandsArray= []; if (Array.isArray(router.query.brand)) { brandsArray = router.query.brand; } else if (typeof router.query.brand === 'string') { brandsArray = router.query.brand.split(',').map((brand) => brand.trim()); } setBrandValues(brandsArray); } else { setBrandValues([]); } if (router.query.category) { let categoriesArray= []; if (Array.isArray(router.query.category)) { categoriesArray = router.query.category; } else if (typeof router.query.category === 'string') { categoriesArray = router.query.category.split(',').map((category) => category.trim()); } setCategoryValues(categoriesArray); } else { setCategoryValues([]); } }, [router.query.brand, router.query.category]); useEffect(() => { const loadPromo = async () => { setLoading(true); const brandsData = []; const categoriesData= []; const pageNumber = Array.isArray(page) ? parseInt(page[0], 10) : parseInt(page, 10); setCurrentPage(pageNumber) try { const items = await fetchPromoItemsSolr(`type_value_s:${Array.isArray(slug) ? slug[0] : slug}`,0,10); setPromoItems(items); if (items.length === 0) { setPromoData([]) setLoading(false); return; } const brandArray = Array.isArray(brand) ? brand : brand.split(','); const categoryArray = Array.isArray(category) ? category : category.split(','); const promoDataPromises = items.map(async (item) => { try { let brandQuery = ''; if (brand) { brandQuery = brandArray.map(b => `manufacture_name_s:${b}`).join(' OR '); brandQuery = `(${brandQuery})`; } let categoryQuery = ''; if (category) { categoryQuery = categoryArray.map(c => `category_name:${c}`).join(' OR '); categoryQuery = `(${categoryQuery})`; } let priceQuery = ''; if (priceFrom && priceTo) { priceQuery = `price_f:[${priceFrom} TO ${priceTo}]`; } else if (priceFrom) { priceQuery = `price_f:[${priceFrom} TO *]`; } else if (priceTo) { priceQuery = `price_f:[* TO ${priceTo}]`; } let combinedQuery = ''; let combinedQueryPrice = `${priceQuery}`; if (brand && category && priceFrom || priceTo) { combinedQuery = `${brandQuery} AND ${categoryQuery} `; } else if (brand && category) { combinedQuery = `${brandQuery} AND ${categoryQuery}`; } else if (brand && priceFrom || priceTo) { combinedQuery = `${brandQuery}`; } else if (category && priceFrom || priceTo) { combinedQuery = `${categoryQuery}`; } else if (brand) { combinedQuery = brandQuery; } else if (category) { combinedQuery = categoryQuery; } if (combinedQuery && priceFrom || priceTo) { const response = await fetchVariantSolr(`id:${item.product_id} AND ${combinedQuery}`); const product = response.response.docs[0]; const product_id = product.id; const response2 = await fetchPromoItemsSolr(`type_value_s:${Array.isArray(slug) ? slug[0] : slug} AND product_ids:${product_id} AND ${combinedQueryPrice}`,0,100); return response2; }else if(combinedQuery){ const response = await fetchVariantSolr(`id:${item.product_id} AND ${combinedQuery}`); const product = response.response.docs[0]; const product_id = product.id; const response2 = await fetchPromoItemsSolr(`type_value_s:${Array.isArray(slug) ? slug[0] : slug} AND product_ids:${product_id} `,0,100); return response2; } else { const response = await fetchPromoItemsSolr(`id:${item.id}`,0,100); return response; } } catch (fetchError) { return []; } }); const promoDataArray = await Promise.all(promoDataPromises); const mergedPromoData = promoDataArray.reduce((accumulator, currentValue) => accumulator.concat(currentValue), []); setPromoData(mergedPromoData); const dataBrandCategoryPromises = promoDataArray.map(async (promoData) => { if (promoData) { const dataBrandCategory = promoData.map(async (item) => { let response; if(category){ const categoryQuery = categoryArray.map(c => `category_name:${c}`).join(' OR '); response = await fetchVariantSolr(`id:${item.products[0].product_id} AND (${categoryQuery})`); }else{ response = await fetchVariantSolr(`id:${item.products[0].product_id}`) } if (response.response?.docs?.length > 0) { const product = response.response.docs[0]; const manufactureNameS = product.manufacture_name; if (Array.isArray(manufactureNameS)) { for (let i = 0; i < manufactureNameS.length; i += 2) { const brand = manufactureNameS[i]; const qty = 1; const existingBrandIndex = brandsData.findIndex(b => b.brand === brand); if (existingBrandIndex !== -1) { brandsData[existingBrandIndex].qty += qty; } else { brandsData.push({ brand, qty }); } } } const categoryNameS = product.category_name; if (Array.isArray(categoryNameS)) { for (let i = 0; i < categoryNameS.length; i += 2) { const name = categoryNameS[i]; const qty = 1; const existingCategoryIndex = categoriesData.findIndex(c => c.name === name); if (existingCategoryIndex !== -1) { categoriesData[existingCategoryIndex].qty += qty; } else { categoriesData.push({ name, qty }); } } } } }); return Promise.all(dataBrandCategory); } }); await Promise.all(dataBrandCategoryPromises); setBrands(brandsData); setCategories(categoriesData); setLoading(false); } catch (loadError) { // console.error("Error loading promo items:", loadError) setLoading(false); } } if (slug) { loadPromo() } },[slug, brand, category, priceFrom, priceTo, currentPage]); function capitalizeFirstLetter(string) { string = string.replace(/_/g, ' '); return string.replace(/(^\w|\s\w)/g, function(match) { return match.toUpperCase(); }); } const handleDeleteFilter = async (source, value) => { let params = { q: router.query.q, orderBy: '', brand: brandValues.join(','), category: categoryValues.join(','), priceFrom: priceFrom || '', priceTo: priceTo || '', }; let brands = brandValues; let catagories = categoryValues; switch (source) { case 'brands': brands = brandValues.filter((item) => item !== value); params.brand = brands.join(','); await setBrandValues(brands); break; case 'category': catagories = categoryValues.filter((item) => item !== value); params.category = catagories.join(','); await setCategoryValues(catagories); break; case 'price': params.priceFrom = ''; params.priceTo = ''; break; case 'delete': params = { q: router.query.q, orderBy: '', brand: '', category: '', priceFrom: '', priceTo: '', }; break; } handleSubmitFilter(params); }; const handleSubmitFilter = (params) => { params = _.pickBy(params, _.identity); params = toQuery(params); router.push(`${slug}?${params}`); }; const visiblePromotions = promoData?.slice( (currentPage-1) * itemsPerPage, currentPage * 12) const toQuery = (obj) => { const str = Object.keys(obj) .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}`) .join('&') return str } const whatPromo = capitalizeFirstLetter(slug) const queryWithoutSlug = _.omit(router.query, ['slug']) const queryString = toQuery(queryWithoutSlug) return (

Promo {whatPromo}

{promoItems.length >= 1 && (
)} {loading ? (
) : promoData && promoItems.length >= 1 ? ( <>
{products?.map((promotion) => (
))}
) : (

Belum ada promo pada kategori ini

)}

Promo {whatPromo}

{/* */}
{loading ? (
) : promoData && promoItems.length >= 1 ? ( <>
{products?.map((promotion) => (
))}
) : (

Belum ada promo pada kategori ini

)}
Barang yang anda cari tidak ada?{' '} Hubungi Kami
) } const FilterChoicesComponent = ({ brandValues, categoryValues, priceFrom, priceTo, handleDeleteFilter, }) => (
{brandValues?.map((value, index) => ( {value} handleDeleteFilter('brands', value)} /> ))} {categoryValues?.map((value, index) => ( {value} handleDeleteFilter('category', value)} /> ))} {priceFrom && priceTo && ( {formatCurrency(priceFrom) + '-' + formatCurrency(priceTo)} handleDeleteFilter('price', priceFrom)} /> )} {brandValues?.length > 0 || categoryValues?.length > 0 || priceFrom || priceTo ? ( ) : ( '' )}
);